// 成语数据库和查询系统
class IdiomDatabase {
    constructor() {
        this.idioms = this.initializeIdioms();
        this.pinyinMap = this.buildPinyinMap();
        this.charMap = this.buildCharMap();
    }
    
    // 初始化成语数据库
    initializeIdioms() {
        return [
            // 四字成语数据
            {
                idiom: "画龙点睛",
                pinyin: "huà lóng diǎn jīng",
                meaning: "比喻写文章或讲话时，在关键处用几句话点明实质，使内容生动有力。",
                example: "这篇文章的结尾画龙点睛，使主题更加突出。",
                story: "传说张僧繇画龙不点眼睛，说点了就会飞走。人们不信，他点了两条龙的眼睛，果然雷电交加，破壁飞去。"
            },
            {
                idiom: "惊心动魄",
                pinyin: "jīng xīn dòng pò",
                meaning: "形容使人感受很深，震动很大。也指作品、表演等精彩，扣人心弦。",
                example: "这场惊心动魄的篮球赛让观众们屏息凝神。",
                story: "古代有一位勇士，面对千军万马毫不畏惧，他的英勇事迹惊心动魄，被后人传颂。"
            },
            {
                idiom: "破釜沉舟",
                pinyin: "pò fǔ chén zhōu",
                meaning: "比喻下定最大决心，不顾一切地干到底。",
                example: "这次考试我要破釜沉舟，一定要考出好成绩。",
                story: "项羽带兵渡河，让士兵们砸锅沉船，只带三天粮食，表示不胜则死的决心。"
            },
            {
                idiom: "程门立雪",
                pinyin: "chéng mén lì xuě",
                meaning: "旧指学生恭敬求教。比喻尊师重道。",
                example: "他对老师的尊敬真是程门立雪，令人感动。",
                story: "宋代学者杨时和游酢去拜访老师程颐，见老师正在打坐，就在门外雪中等候，等老师醒来时，门外的雪已经一尺深了。"
            },
            {
                idiom: "望梅止渴",
                pinyin: "wàng méi zhǐ kě",
                meaning: "比喻用空想来安慰自己，或比喻愿望无法实现。",
                example: "在没有水喝的沙漠里，想象着绿洲只是望梅止渴。",
                story: "曹操带兵行军，士兵们都口渴难耐。曹操指着前方说有梅林，士兵们想到酸梅，口中生津，暂时缓解了口渴。"
            },
            {
                idiom: "刻舟求剑",
                pinyin: "kè zhōu qiú jiàn",
                meaning: "比喻办事刻板，不知变通。",
                example: "他的做法就像刻舟求剑，完全不符合实际情况。",
                story: "楚国有个人过江时把剑掉入水中，他在船上刻记号，等船到岸后从刻记号处下水找剑，结果当然找不到。"
            },
            {
                idiom: "掩耳盗铃",
                pinyin: "yǎn ěr dào líng",
                meaning: "比喻自己欺骗自己，明明掩盖不住的事情偏要想法子掩盖。",
                example: "他以为关闭网络就能躲过责任，这种掩耳盗铃的做法很可笑。",
                story: "有个人想偷铃铛，又怕听到铃响，于是堵住自己的耳朵。他认为自己听不见，别人也就听不见了。"
            },
            {
                idiom: "买椟还珠",
                pinyin: "mǎi dú huán zhū",
                meaning: "比喻没有眼光，取舍不当。",
                example: "只注重外表而忽视内在，就像买椟还珠一样。",
                story: "楚国有人买珠宝，只要了漂亮的盒子而退还了里面的珍珠，显得没有眼光。"
            },
            {
                idiom: "井底之蛙",
                pinyin: "jǐng dǐ zhī wā",
                meaning: "比喻见识短浅的人。",
                example: "我们要多读书，不做井底之蛙。",
                story: "井里的青蛙以为天只有井口那么大，直到从东海来的大鳖告诉它大海的广阔。"
            },
            {
                idiom: "狐假虎威",
                pinyin: "hú jiǎ hǔ wēi",
                meaning: "比喻依仗别人的势力欺压人。",
                example: "他仗着父亲的权利横行霸道，真是狐假虎威。",
                story: "老虎抓住狐狸要吃它，狐狸说天帝让它做百兽之王。老虎不信，狐狸就让老虎跟在它后面，果然动物们都吓跑了。"
            },
            {
                idiom: "守株待兔",
                pinyin: "shǒu zhū dài tù",
                meaning: "比喻死守经验，不知变通。也比喻不主动努力，而存万一的侥幸心理，希望得到意外的收获。",
                example: "学习不能守株待兔，要主动探索。",
                story: "宋国有个农夫看见一只兔子撞树死了，他从此放下农具守在树旁，希望再捡到兔子，结果一无所获。"
            },
            {
                idiom: "愚公移山",
                pinyin: "yú gōng yí shān",
                meaning: "比喻下定决心，坚持不懈地奋斗。",
                example: "面对困难，我们要有愚公移山的精神。",
                story: "古代有位老人愚公，家门前有两座大山，他决定带领子孙们把山挖掉。他们的精神感动了天帝，派神仙把山背走了。"
            },
            {
                idiom: "精卫填海",
                pinyin: "jīng wèi tián hǎi",
                meaning: "比喻意志坚决，不畏艰难，奋斗到底。",
                example: "她以精卫填海的毅力学习外语，终于成功了。",
                story: "炎帝的小女儿女娃在海里淹死，化作小鸟精卫，每天衔着石子和树枝，想要填平大海。"
            },
            {
                idiom: "夸父追日",
                pinyin: "kuā fù zhuī rì",
                meaning: "比喻有宏大的志向和气魄，也比喻不自量力。",
                example: "年轻人要有夸父追日的勇气，敢于追求梦想。",
                story: "巨人夸父想要追上太阳，他一直追，追到太阳落山的地方，口渴而死，手杖化为桃林。"
            },
            {
                idiom: "嫦娥奔月",
                pinyin: "cháng é bēn yuè",
                meaning: "比喻飞向美好的地方，也指思念亲人。",
                example: "中秋夜，人们望着月亮，想起了嫦娥奔月的故事。",
                story: "后羿的妻子嫦娥偷吃了长生不老药，身体变轻飞向月宫，从此与丈夫分离。"
            },
            {
                idiom: "牛郎织女",
                pinyin: "niú láng zhī nǚ",
                meaning: "比喻分居两地的夫妻，也指银河。",
                example: "每年的七夕节，人们都记得牛郎织女的故事。",
                story: "牛郎和织女相爱，被王母娘娘分开，只能每年七月七日在鹊桥相会一次。"
            },
            {
                idiom: "白手起家",
                pinyin: "bái shǒu qǐ jiā",
                meaning: "形容在没有基础或条件很差的情况下自力更生，艰苦创业。",
                example: "他靠着白手起家的精神，从小商贩做到了大企业家。",
                story: "古代有位年轻人，一无所有但很有志气，通过勤劳和智慧，最终建立了自己的家业。"
            },
            {
                idiom: "一心一意",
                pinyin: "yī xīn yī yì",
                meaning: "形容专心专意，没有杂念。",
                example: "学习时要一心一意，不能三心二意。",
                story: "古时有位学者，专心致志研究学问，从不被外界干扰，最终成为大学问家。"
            },
            {
                idiom: "三心二意",
                pinyin: "sān xīn èr yì",
                meaning: "形容犹豫不决，意志不坚定或用心不专一。",
                example: "做事三心二意的人很难成功。",
                story: "有个猎人打猎时既想射鸟又想捕兔，结果什么都没抓到。"
            },
            {
                idiom: "四面八方",
                pinyin: "sì miàn bā fāng",
                meaning: "指各个地方或各个方面。",
                example: "消息传开后，四面八方的人都来帮忙。",
                story: "古代战场上，敌军从四面八方包围过来，形势危急。"
            },
            {
                idiom: "五光十色",
                pinyin: "wǔ guāng shí sè",
                meaning: "形容色彩鲜艳，花样繁多。",
                example: "晚霞映照的天空五光十色，十分美丽。",
                story: "古代工匠制作的琉璃器皿在阳光下五光十色，令人赞叹不已。"
            },
            {
                idiom: "六神无主",
                pinyin: "liù shén wú zhǔ",
                meaning: "形容心慌意乱，不知所措。",
                example: "听到突发消息，他顿时六神无主。",
                story: "古时有人突然失去方向感，感觉心神不定，不知该往哪里走。"
            },
            {
                idiom: "七上八下",
                pinyin: "qī shàng bā xià",
                meaning: "形容心里慌乱不安，无所适从。",
                example: "等待考试结果时，他心里七上八下的。",
                story: "古时有人心神不宁，感觉有东西在心口上下跳动，形容内心不安。"
            },
            {
                idiom: "九牛一毛",
                pinyin: "jiǔ niú yī máo",
                meaning: "比喻极大数量中极微小的部分，微不足道。",
                example: "这点困难对我来说只是九牛一毛。",
                story: "九头牛身上的一根毛，形容极其微小。"
            },
            {
                idiom: "十全十美",
                pinyin: "shí quán shí měi",
                meaning: "形容各方面都非常完美，毫无缺陷。",
                example: "这个计划考虑周全，可以说是十全十美。",
                story: "古代工匠追求十全十美的工艺，每个细节都要做到最好。"
            }
        ];
    }
    
    // 构建拼音映射
    buildPinyinMap() {
        const map = {};
        this.idioms.forEach(item => {
            map[item.idiom] = item.pinyin;
        });
        return map;
    }
    
    // 构建首尾字符映射
    buildCharMap() {
        const map = {};
        this.idioms.forEach(item => {
            const firstChar = item.idiom[0];
            const lastChar = item.idiom[item.idiom.length - 1];
            
            if (!map[lastChar]) {
                map[lastChar] = [];
            }
            map[lastChar].push(item);
        });
        return map;
    }
    
    // 查询成语是否存在
    searchIdiom(idiom) {
        return this.idioms.find(item => item.idiom === idiom);
    }
    
    // 根据首字查找成语
    findByIdiomStartChar(char) {
        return this.idioms.filter(item => item.idiom.startsWith(char));
    }
    
    // 根据尾字查找可以接龙的成语
    findNextIdioms(lastChar) {
        return this.charMap[lastChar] || [];
    }
    
    // 获取成语的拼音
    getPinyin(idiom) {
        return this.pinyinMap[idiom] || '';
    }
    
    // 验证成语接龙规则
    validateIdiomChain(prevIdiom, nextIdiom) {
        if (!prevIdiom || !nextIdiom) return false;
        
        const prevLast = prevIdiom[prevIdiom.length - 1];
        const nextFirst = nextIdiom[0];
        
        return prevLast === nextFirst && this.searchIdiom(nextIdiom);
    }
    
    // 获取随机成语
    getRandomIdiom() {
        const index = Math.floor(Math.random() * this.idioms.length);
        return this.idioms[index];
    }
    
    // 获取成语建议
    getSuggestions(startChar, count = 5) {
        const candidates = this.findByIdiomStartChar(startChar);
        const shuffled = candidates.sort(() => Math.random() - 0.5);
        return shuffled.slice(0, count);
    }
    
    // 获取相似成语（基于含义）
    getSimilarIdioms(keyword) {
        return this.idioms.filter(item => 
            item.meaning.includes(keyword) || 
            item.example.includes(keyword) ||
            item.story.includes(keyword)
        );
    }
    
    // 统计信息
    getStats() {
        return {
            total: this.idioms.length,
            uniqueStartChars: new Set(this.idioms.map(item => item.idiom[0])).size,
            uniqueEndChars: new Set(this.idioms.map(item => item.idiom[item.idiom.length - 1])).size,
            averageLength: this.idioms.reduce((sum, item) => sum + item.idiom.length, 0) / this.idioms.length
        };
    }
}

// 成语验证器
class IdiomValidator {
    constructor(database) {
        this.database = database;
    }
    
    // 验证输入是否为有效成语
    isValidIdiom(input) {
        // 基本验证
        if (!input || typeof input !== 'string') return false;
        
        // 长度验证（大部分成语为4字）
        if (input.length !== 4) return false;
        
        // 查询数据库
        return this.database.searchIdiom(input) !== undefined;
    }
    
    // 验证接龙规则
    isValidChain(prevIdiom, nextIdiom) {
        if (!this.isValidIdiom(nextIdiom)) return false;
        return this.database.validateIdiomChain(prevIdiom, nextIdiom);
    }
    
    // 获取错误提示
    getErrorMessage(input, prevIdiom = null) {
        if (!input || input.trim().length === 0) {
            return "请输入一个成语";
        }
        
        if (input.length !== 4) {
            return "成语通常是四个字哦";
        }
        
        if (!this.database.searchIdiom(input)) {
            return `没有找到"${input}"这个成语，请检查一下`;
        }
        
        if (prevIdiom) {
            const lastChar = prevIdiom[prevIdiom.length - 1];
            const firstChar = input[0];
            if (lastChar !== firstChar) {
                return `成语应该以"${lastChar}"字开头，而不是"${firstChar}"字`;
            }
        }
        
        return "输入有效";
    }
    
    // 实时验证输入
    validateInput(input, prevIdiom = null) {
        const result = {
            isValid: false,
            error: '',
            suggestions: []
        };
        
        if (!input || input.length === 0) {
            return result;
        }
        
        if (input.length < 4) {
            result.error = "成语通常是四个字";
            return result;
        }
        
        if (input.length > 4) {
            result.error = "成语只能是四个字";
            return result;
        }
        
        // 检查是否为有效成语
        const idiomInfo = this.database.searchIdiom(input);
        if (!idiomInfo) {
            result.error = `没有找到"${input}"这个成语`;
            // 提供相似建议
            result.suggestions = this.getSimilarSuggestions(input);
            return result;
        }
        
        // 检查接龙规则
        if (prevIdiom) {
            if (!this.database.validateIdiomChain(prevIdiom, input)) {
                const lastChar = prevIdiom[prevIdiom.length - 1];
                const firstChar = input[0];
                if (lastChar !== firstChar) {
                    result.error = `应该以"${lastChar}"字开头`;
                    // 提供正确开头的建议
                    result.suggestions = this.database.getSuggestions(lastChar, 3);
                }
                return result;
            }
        }
        
        result.isValid = true;
        return result;
    }
    
    // 获取相似建议
    getSimilarSuggestions(input) {
        // 这里可以实现更复杂的相似度算法
        // 简单实现：基于首字和尾字
        if (input.length >= 1) {
            return this.database.findByIdiomStartChar(input[0]).slice(0, 3);
        }
        return [];
    }
}

// 导出类
if (typeof module !== 'undefined' && module.exports) {
    module.exports = { IdiomDatabase, IdiomValidator };
}